Skip to content

feat(repo)!: v10.0.0#2499

Open
xsahil03x wants to merge 161 commits into
masterfrom
v10.0.0
Open

feat(repo)!: v10.0.0#2499
xsahil03x wants to merge 161 commits into
masterfrom
v10.0.0

Conversation

@xsahil03x
Copy link
Copy Markdown
Member

@xsahil03x xsahil03x commented Feb 2, 2026

v10.0.0 — Design Refresh & API Modernization

This is the v10.0.0 major release for Stream Chat Flutter. It introduces a refreshed UI, redesigned customization APIs, new chat features (location sharing, delete-for-me, slow mode UI), and aligns naming with the Android and iOS SDKs.

📖 Full migration guide — start here if you're upgrading from v9.x or any v10 beta.


Headline changes

🎨 SDK redesign (#2503)

A full visual refresh across the entire UI package, synced with the Figma design system. New default theme, updated channel/message/composer/poll/media surfaces, simplified icon set (#2619).

💬 New chat features

🧱 Breaking API redesigns

🛠 Other notable changes

🐞 Notable fixes


Scope

  • 1,243 files changed, +95,965 / −73,263 lines
  • 135 commits since master (12 beta releases: 10.0.0-beta.1 through 10.0.0-beta.13)
  • Latest master merged in via chore(repo): merge master into v10.0.0 #2682 and the merge commit at the tip of this branch

Test plan

  • melos run test:all passes (Dart + Flutter, CI goldens)
  • melos run lint:all passes (analyze + format)
  • melos run generate:all produces no diff
  • Sample app runs against a live channel: send/edit/delete messages, react, share location, create poll, change channel info
  • Migration guide validated end-to-end against a v9.x upgrade in a scratch project
  • Existing beta consumers verified against v10.0.0-beta.1310.0.0

🤖 Generated with Claude Code

xsahil03x and others added 30 commits May 26, 2025 16:59
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts:
#	packages/stream_chat_flutter/CHANGELOG.md
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts:
#	packages/stream_chat_flutter/CHANGELOG.md
# Conflicts:
#	packages/stream_chat_flutter/CHANGELOG.md
#	packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts:
#	melos.yaml
#	packages/stream_chat/CHANGELOG.md
#	packages/stream_chat/example/pubspec.yaml
#	packages/stream_chat/lib/version.dart
#	packages/stream_chat/pubspec.yaml
#	packages/stream_chat_flutter/example/pubspec.yaml
#	packages/stream_chat_flutter/pubspec.yaml
#	packages/stream_chat_flutter_core/example/pubspec.yaml
#	packages/stream_chat_flutter_core/pubspec.yaml
#	packages/stream_chat_localizations/CHANGELOG.md
#	packages/stream_chat_localizations/example/pubspec.yaml
#	packages/stream_chat_localizations/pubspec.yaml
#	packages/stream_chat_persistence/CHANGELOG.md
#	packages/stream_chat_persistence/example/pubspec.yaml
#	packages/stream_chat_persistence/pubspec.yaml
#	sample_app/pubspec.yaml
# Conflicts:
#	packages/stream_chat/CHANGELOG.md
#	packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts:
#	melos.yaml
#	packages/stream_chat/CHANGELOG.md
#	packages/stream_chat/example/pubspec.yaml
#	packages/stream_chat/lib/version.dart
#	packages/stream_chat/pubspec.yaml
#	packages/stream_chat_flutter/CHANGELOG.md
#	packages/stream_chat_flutter/example/pubspec.yaml
#	packages/stream_chat_flutter/pubspec.yaml
#	packages/stream_chat_flutter_core/example/pubspec.yaml
#	packages/stream_chat_flutter_core/pubspec.yaml
#	packages/stream_chat_localizations/CHANGELOG.md
#	packages/stream_chat_localizations/example/pubspec.yaml
#	packages/stream_chat_localizations/pubspec.yaml
#	packages/stream_chat_persistence/CHANGELOG.md
#	packages/stream_chat_persistence/example/pubspec.yaml
#	packages/stream_chat_persistence/pubspec.yaml
#	sample_app/pubspec.yaml
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts:
#	packages/stream_chat/CHANGELOG.md
#	packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts:
#	packages/stream_chat_flutter/CHANGELOG.md
#	packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart
#	packages/stream_chat_persistence/CHANGELOG.md
The animation curves and durations for the reaction picker and message modal have been updated for a smoother user experience.

- The `reaction_picker_icon_list.dart` animation curve is now `Curves.easeOutBack` and the duration is 335 milliseconds.
- The `message_modal.dart` transition duration is now 335 milliseconds, and the scale animation curve is `Curves.easeOutBack`.
# Conflicts:
#	packages/stream_chat_persistence/CHANGELOG.md
#	packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart
xsahil03x and others added 2 commits May 28, 2026 12:58
# Conflicts:
#	.github/workflows/stream_flutter_workflow.yml
#	melos.yaml
#	packages/stream_chat/CHANGELOG.md
#	packages/stream_chat/example/pubspec.yaml
#	packages/stream_chat/lib/src/client/channel.dart
#	packages/stream_chat/lib/src/client/client.dart
#	packages/stream_chat/lib/src/core/util/list_extensions.dart
#	packages/stream_chat/lib/version.dart
#	packages/stream_chat/pubspec.yaml
#	packages/stream_chat/test/src/client/channel_test.dart
#	packages/stream_chat/test/src/client/client_test.dart
#	packages/stream_chat/test/src/core/util/in_flight_cache_test.dart
#	packages/stream_chat/test/src/core/util/list_extensions_test.dart
#	packages/stream_chat_flutter/CHANGELOG.md
#	packages/stream_chat_flutter/example/pubspec.yaml
#	packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart
#	packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart
#	packages/stream_chat_flutter/lib/scrollable_positioned_list/src/viewport.dart
#	packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart
#	packages/stream_chat_flutter/lib/src/message_input/stream_message_input_attachment_list.dart
#	packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart
#	packages/stream_chat_flutter/lib/src/misc/separated_reorderable_list_view.dart
#	packages/stream_chat_flutter/lib/src/poll/creator/poll_switch_list_tile.dart
#	packages/stream_chat_flutter/pubspec.yaml
#	packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/item_key_builder_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart
#	packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_idle_dark.png
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_idle_light.png
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playing_dark.png
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playing_light.png
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playlist_dark.png
#	packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playlist_light.png
#	packages/stream_chat_flutter/test/src/avatars/goldens/ci/gradient_avatar_issue_2369.png
#	packages/stream_chat_flutter/test/src/avatars/goldens/ci/group_avatar_0.png
#	packages/stream_chat_flutter/test/src/avatars/goldens/ci/user_avatar_0.png
#	packages/stream_chat_flutter/test/src/avatars/goldens/ci/user_avatar_1.png
#	packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/attachment_modal_sheet_0.png
#	packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/edit_message_sheet_0.png
#	packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/error_alert_sheet_0.png
#	packages/stream_chat_flutter/test/src/channel/goldens/ci/channel_header_bottom_widget.png
#	packages/stream_chat_flutter/test/src/dialogs/goldens/ci/confirmation_dialog_0.png
#	packages/stream_chat_flutter/test/src/dialogs/goldens/ci/delete_message_dialog_0.png
#	packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_0.png
#	packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_1.png
#	packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_2.png
#	packages/stream_chat_flutter/test/src/gallery/goldens/ci/gallery_footer_0.png
#	packages/stream_chat_flutter/test/src/gallery/goldens/ci/gallery_header_0.png
#	packages/stream_chat_flutter/test/src/icons/goldens/ci/stream_svg_icon_light.png
#	packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_0.png
#	packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_1.png
#	packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_2.png
#	packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_3.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_idle_dark.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_idle_light.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_hold_dark.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_hold_light.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_locked_dark.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_locked_light.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_stopped_dark.png
#	packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_stopped_light.png
#	packages/stream_chat_flutter/test/src/message_input/goldens/ci/attachment_button_0.png
#	packages/stream_chat_flutter/test/src/message_input/goldens/ci/clear_input_item_0.png
#	packages/stream_chat_flutter/test/src/message_input/goldens/ci/command_button_0.png
#	packages/stream_chat_flutter/test/src/message_input/goldens/ci/countdown_button_0.png
#	packages/stream_chat_flutter/test/src/message_list_view/auto_scroll_test.dart
#	packages/stream_chat_flutter/test/src/message_list_view/mark_read_test.dart
#	packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_custom.png
#	packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_dark.png
#	packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_light.png
#	packages/stream_chat_flutter/test/src/message_widget/goldens/ci/message_text.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_2.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_3_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_3_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_like_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_like_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_custom_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_custom_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_empty_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_empty_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_inverted_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_inverted_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_less_data_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_less_data_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_progress_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_progress_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_timestamp_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_timestamp_light.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/system_message_dark.png
#	packages/stream_chat_flutter/test/src/misc/goldens/ci/system_message_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_delete_option_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_delete_option_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_error_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_error_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_error_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_error_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_full_screen_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_full_screen_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_error.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_error.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_full_screen_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_full_screen_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_options_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_options_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_with_show_all_dark.png
#	packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_with_show_all_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_with_initial_value_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_with_initial_value_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_end_vote_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_end_vote_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_long_question_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_long_question_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_all_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_all_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_disabled_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_disabled_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_limited_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_limited_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_unique_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_unique_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_with_initial_option_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_with_initial_option_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_closed_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_closed_light.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_dark.png
#	packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_light.png
#	packages/stream_chat_flutter/test/src/scroll_view/draft_scroll_view/goldens/ci/stream_draft_list_tile_dark.png
#	packages/stream_chat_flutter/test/src/scroll_view/draft_scroll_view/goldens/ci/stream_draft_list_tile_light.png
#	packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_thread_list_tile_dark.png
#	packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_thread_list_tile_light.png
#	packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_unread_threads_banner_dark.png
#	packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_unread_threads_banner_light.png
#	packages/stream_chat_flutter_core/CHANGELOG.md
#	packages/stream_chat_flutter_core/example/pubspec.yaml
#	packages/stream_chat_flutter_core/lib/src/better_stream_builder.dart
#	packages/stream_chat_flutter_core/lib/src/message_list_core.dart
#	packages/stream_chat_flutter_core/lib/src/paged_value_scroll_view.dart
#	packages/stream_chat_flutter_core/pubspec.yaml
#	packages/stream_chat_flutter_core/test/message_list_core_test.dart
#	packages/stream_chat_flutter_core/test/stream_channel_test.dart
#	packages/stream_chat_flutter_core/test/stream_chat_core_test.dart
#	packages/stream_chat_localizations/CHANGELOG.md
#	packages/stream_chat_localizations/example/pubspec.yaml
#	packages/stream_chat_localizations/pubspec.yaml
#	packages/stream_chat_persistence/CHANGELOG.md
#	packages/stream_chat_persistence/example/pubspec.yaml
#	packages/stream_chat_persistence/lib/src/db/shared/native_db.dart
#	packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart
#	packages/stream_chat_persistence/pubspec.yaml
#	packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart
#	sample_app/ios/Runner/Info.plist
#	sample_app/ios/fastlane/Fastfile
#	sample_app/lib/app.dart
#	sample_app/lib/firebase_options.dart
#	sample_app/pubspec.yaml
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 28, 2026

⚠️ Database Entity Files Modified

The following database entity files have been modified in this PR:

packages/stream_chat_persistence/lib/src/entity/channel_queries.dart
packages/stream_chat_persistence/lib/src/entity/channels.dart
packages/stream_chat_persistence/lib/src/entity/draft_messages.dart
packages/stream_chat_persistence/lib/src/entity/entity.dart
packages/stream_chat_persistence/lib/src/entity/locations.dart
packages/stream_chat_persistence/lib/src/entity/members.dart
packages/stream_chat_persistence/lib/src/entity/messages.dart
packages/stream_chat_persistence/lib/src/entity/pinned_message_reactions.dart
packages/stream_chat_persistence/lib/src/entity/poll_votes.dart
packages/stream_chat_persistence/lib/src/entity/polls.dart
packages/stream_chat_persistence/lib/src/entity/reactions.dart
packages/stream_chat_persistence/lib/src/entity/reads.dart

📝 Remember to:

  1. Update database version in db/drift_chat_database.dart.
  2. Update entity schema tests if necessary.

Note: This comment is automatically generated by the CI workflow.

renefloor and others added 23 commits May 28, 2026 14:54
* update migration docs with latest changes

* Add migration doc for sort option

* docs: correct migration docs against verified source

Apply ~70+ corrections across all 16 redesign migration docs and
v10-migration.md based on a source-by-source verification pass. Fixes
non-existent symbols, wrong constructor params, wrong typedef
signatures, and stale class names that would prevent migration code
examples from compiling. Adds the missing ClientState collection
immutability breaking-change section (introduced in 2501f53).

Also cleans up five stale dartdoc references in source that seeded
some of the wrong names in the docs (StreamMessagePlacement →
StreamMessageLayout, UrlAttachmentBuilder → LinkPreviewAttachmentBuilder,
StreamChat(config:) → streamChatConfigData:, etc.).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(ui)!: remove unused MessageDetails class

The MessageDetails class was only used by itself — no live consumers in
packages/ or sample_app. The new messageBuilder signature stopped passing
it as an argument, leaving the class as dead public surface area. Delete
the file and its export; update CHANGELOG and the migration doc that
previously said "no longer passed to builders" to reflect the actual
removal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(ui): re-export StreamAvatarTheme/Data from stream_core_flutter

The two avatar theme types live in stream_core_flutter, but consumers
who only depended on stream_chat_flutter had to add a second import to
theme avatars globally. Add them to the show allowlist so existing
StreamAvatarThemeData imports keep working, drop the now-redundant
stream_core_flutter import from stream_media_gallery_item.dart, and
update the migration doc that previously instructed users to import
from stream_core_flutter directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(ui): inline AttachmentPickerOptionsBuilder typedef, drop empty file

stream_attachment_picker_bottom_sheet.dart only held the
AttachmentPickerOptionsBuilder typedef — the filename implied a sheet
class that no longer exists after pickers became inline. Move the
typedef into stream_attachment_picker.dart (next to the picker widgets
and builder functions that use it) and delete the misleading file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: add Stream Core / Stream Chat preamble to redesign README

Front-load the two-layer split so future doc passes don't conflate
"moved to stream_core_flutter" with "removed." Includes a small
core-primitive ↔ chat-wrapper table and a "frequently confused names"
list covering the wrong-name patterns that surfaced during the
verification pass (StreamMessagePlacement → StreamMessageLayout,
kStreamHeaderHeight → kStreamToolbarHeight, etc.).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: address CodeRabbit review comments

- attachments_and_polls.md: fix stale #streamattachmentpickeroption
  anchor (→ #attachment-picker) and drop reference to the removed
  showStreamAttachmentPickerModalBottomSheet function.
- v10-migration.md: stable-release boundary was beta.12, not beta.13
  (matches the upgrade matrix at the top of the doc).
- message_actions.md: drop StreamMessageReactionsModal from the
  showStreamDialog Future<T?> "returns" list — the class is deleted.
- message_composer.md: destructure cooldownTimeOut from
  SlowModePlaceholder so translations.slowModeOnLabel(int) gets its
  required argument; matches the source dartdoc example verbatim.

The fourth flagged comment (onDismissTap row in unread_indicator_button.md)
was already removed in the earlier verification pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(ui): use American spelling "customization" in reaction_picker.md

Line 31 used British "customisation" while the rest of the doc (and the
heading at line 299) uses American "Customization". Match the rest.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fixed last StreamMessagePlacement occurrence

---------

Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
Co-authored-by: Sahil Kumar <sahil@getstream.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Enable drafts and voice recording by default

* update drafts default in sample app

* Disable enforceUniqueReactions by default

* Update changelog

* Add draft mocks
* apply filter of supported emoji

* Update changelog

* Add doc screenshots

* chore: Update Docs Snapshots

* test(docs): settle before precaching so deferred avatars decode

docsGoldenTest's default pumpBeforeTest now calls pumpAndSettle before
precacheImages, so modal sheets and paginated list views finish rendering
before the image scan runs — fixing the empty avatar circles in the
reaction detail sheet and reaction list view goldens. Reaction stubs move
into the test builders now that custom pumpBeforeTest overrides are no
longer needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: remove unused import

* chore: Update Docs Snapshots

---------

Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com>
Co-authored-by: Sahil Kumar <sahil@getstream.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
…#2699)

* fix(ui): preserve composer state when draft stream emits initial null

`_onDraftUpdate` previously called `_effectiveController.reset()` on any
null emission, including the initial subscription event when no draft
existed on the server. That wiped pre-populated composer state (text,
quoted message, attachments) immediately after the composer mounted.

Track the last draft seen on the stream and reset only on a real non-null
→ null transition; the initial-no-draft case is now a no-op.

Also: stub createDraft/deleteDraft in the docs_screenshots mocks (composer
saves drafts on deactivate), register a DraftMessage mocktail fallback,
seed text/controllers in default-state composer snapshots so they showcase
the send button, and dispose externally-created controllers via
addTearDown.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(ui): cover draft stream behavior in composer

Add unit tests pinning the _onDraftUpdate semantics:
- initial null on subscription preserves pre-populated text, quoted
  message, and attachments;
- non-null draft loads its content into the controller;
- non-null → null transition resets the controller (real removal).

Also move the _lastDraft field next to _onDraftUpdate so the tracking
state is colocated with the logic that uses it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(ci): add 'both' option to update_goldens workflow

Lets a single dispatch run both the SDK and docs golden updates in one
go, instead of having to fire the workflow twice with different targets.
Naming matches the existing 'both' option in the distribute workflows.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: dart format draft composer test

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(docs): dispose seeded controller in custom send icon golden

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: Update Docs Snapshots

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Resolves SPL conflicts in scrollable_positioned_list and positioned_list:
- Take master's preserve-pixels `_updateFirstVisibleItemIfNeeded` (PR #2703)
- Take master's empty-list `_centerSliverPadding` guard
- Take master's RTL `_axisDirection`-based `_updatePositions` branching
- Take master's `_resolveLeadingEndPaddingAdjust` `index != 0` check
- Drop orphaned `message_card_test.dart` (widget deleted in v10 design refresh);
  master's MessageCard fix from #2702 ported to StreamMessageContent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts:
#	.github/workflows/distribute_internal.yml
#	sample_app/ios/fastlane/Fastfile
#	sample_app/pubspec.yaml
#	tools/generate_version.dart
…verlay wraps

Sequel to #2704, which landed `StreamChannel.value` and the
`MessageListCore` dispose-time guard on master but only converted
re-wrap sites that exist on master. The remaining v10-only call sites
were still using the default `StreamChannel(...)` constructor, so they
continued running channel-page positioning on mount and clobbering the
parent route's loaded window.

- Switched the SDK's thread page wrap, long-press message-actions modal,
  media gallery preview, and four poll sheets to `StreamChannel.value`.
- Switched the sample app's info screens, member/edit/detail sheets,
  location detail dialog, deep-link routes, and the channel-media
  gallery push to `StreamChannel.value`.
- Moved the `_isThreadConversation` guard in `MessageListCore` to the
  dispose call site so the intent — "thread mode skips the reload" —
  reads at the point we'd otherwise trigger it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Edit message action in thread view was a silent no-op because ThreadPage
never forwarded an onEditMessageTap callback to its StreamMessageListView.
Mirror the channel page wiring so editing a thread reply drops the
thread's composer into edit mode.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sequel to #2704, which landed the `ScrollablePositionedList` first-frame
guard on master. The thread-side wiring that takes advantage of it was
v10-only and is added here.

- `StreamMessageListView.initialIndex` returns the caller-supplied
  `initialScrollIndex` (or `0`) in thread mode instead of running
  `getInitialIndex` against the channel's loaded window — channel-derived
  indices don't map to thread items and could place the SPL out of bounds.
- The outer `BetterStreamBuilder<Message>` wrapping the thread page now
  uses `mapNotNull` + `firstWhereOrNull`, so it no longer throws
  `Bad state: No element` on every channel-state emission when the parent
  isn't in the channel's loaded window (the steady state after the
  pure-fetch `getMessagesById` fix from #2704).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Remove reactionOverlap from config

* chore: Update Goldens

* update migration docs

* remove any mention of reactionOverlap

---------

Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts:
#	packages/stream_chat_flutter/CHANGELOG.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…attachment validation (#2706)

* Add appSettings API for upload config

* rename sizeLimit

* Added validation also for dropping attachments

* fix doc for maxAttachmentSize

* cover localizations

* fix(ui): remove padding from StreamPhotoGallery

* Wrap `StreamPhotoGallery` with `MediaQuery.removePadding` to fix a bottom padding issue in the gallery picker.

* refactor(llc, ui): restructure appSettings into AppSettingsManager and StreamAttachmentValidator

LLC:
- Move appSettings caching into a dedicated AppSettingsManager owned by the
  client; expose `client.appSettings` (cached) and `client.getAppSettings()`
  (refresh). Auto-loads on connect, clears on disconnect.
- Drop the `UploadConfig.isAllowed` helper — validation logic lives in the
  UI package where it has access to translations and the composer error sheet.
- Add `UploadConfig.defaultSizeLimit` (100 MB, matching backend default).
- Make `AppSettings` and `UploadConfig` equatable.

UI:
- Add `StreamAttachmentValidator` — a stateless rule set built from
  `AppSettings`. Exposes `validateCount(int)` and `validate(Attachment)`
  that return typed errors instead of throwing.
- Add typed errors `AttachmentLimitReachedError`, `AttachmentTooLargeError`,
  and `AttachmentBlockedError`.
- `StreamAttachmentPickerController` now takes a single `validator` param.
- `StreamMessageComposer` validates picked/pasted/dropped attachments via
  the validator (built from `client.appSettings`) and surfaces the first
  failure through the localized error sheet.
- Remove `StreamMessageComposer.maxAttachmentSize`, `onAttachmentLimitExceed`,
  the `AttachmentLimitExceedListener` typedef, and `kDefaultMaxAttachmentSize`.
- `attachmentLimit` becomes non-nullable, defaulting to
  `StreamAttachmentValidator.defaultMaxAttachmentCount` (30 — the backend cap).

Tests:
- 9 new tests for `AppSettingsManager` (cache, refresh, clear, error swallow).
- 28 tests for `StreamAttachmentValidator` covering both lists across both
  dimensions, size fallback, image/file routing, compound extensions, and
  count validation.

Docs:
- Update CHANGELOGs for both packages to reflect the shipped surface.
- Rewrite the `attachmentLimit` section in `migrations/redesign/message_composer.md`
  and add an "AppSettings-driven attachment validation" section.
- Add `AttachmentBlockedError` to the typed-errors section in
  `migrations/v10-migration.md`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: point custom-error-UI guidance to StreamMessageComposer.onError

`onError` on the composer short-circuits the default error sheet and
receives the typed validator errors directly, so it's the right hook
for custom UI. The previous wording reached past the composer into
`StreamAttachmentPickerController.addAttachment`, which leaked
internal wiring.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: document new fileTypeNotSupportedError translation key

Add the new abstract member to:
- migrations/redesign/localizations.md (New Required Abstract Members + checklist count)
- stream_chat_localizations CHANGELOG (Added)
- stream_chat_flutter CHANGELOG (cross-references the localizations migration)

The key is mandatory for any custom Translations subclass and was missing
from the migration docs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(localizations): use early-return in fileTypeNotSupportedError

Replace the inline ternary with an explicit early-return for the
extension-known branch across all locale implementations, the
DefaultTranslations base, the example custom-locale, and the migration
guide.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* i18n: translate fileTypeNotSupportedError across all locales

Replace the English fallback with actual translations in ca, de, es, fr,
hi, it, ja, ko, no, and pt — matching the tone of the adjacent
fileTooLargeError in each locale.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: attribute upload config to Stream Dashboard, not the backend

The size/extension/MIME lists in AppSettings are configured by customers
in the Stream Dashboard and served via GET /app — they're not defined by
the backend. References to "backend-configured" / "the backend value" /
"by the backend" mis-attributed the source; updated to "app-configured"
or "configured in the Stream Dashboard".

Kept "backend" where it's still correct:
- The hard-coded MaxNumberOfMessageAttachments = 30 cap (a backend constant).
- Server-side enforcement (the server does reject mis-typed messages).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: drop "construct your own picker controller" suggestion

The picker controller is constructed inside StreamMessageComposer, not
by SDK users, so suggesting they instantiate one to inject a custom
validator was misleading.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: tighten changelog entries to public surface only

Drop impl details from the AppSettings changelog entries — users care
about the public API (StreamChatClient.appSettings, the typed errors
via onError, the new translation key, the removed/changed composer
params) not about how the SDK loads, caches, or wires things together
under the hood.

Removed entries for StreamAttachmentValidator (plumbing — users never
construct it) and the standalone "Added typed validator errors" line
(the errors are mentioned where they matter, inside the composer
behavior entry).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: drop duplicate migration-doc links from changelog entries

Multiple breaking entries linked to the same message_composer.md
section; the localizations entry duplicated the catch-all link
already present further down. Readers find the migration docs through
the normal route.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: trim verbose changelog entries to match neighbour density

- Tighten the composer-validates entry from two long sentences to two
  short ones (drops "every picked, pasted, and dropped attachment" and
  the "render your own UI" tail).
- Drop the trailing "Required override on any custom Translations
  subclass" — line 58 catch-all already states this.
- Restore the "(replaces the previous size / limit / config parameters)"
  context on the picker controller breaking entry — it's migration info,
  not impl detail, and matches the rename-style neighbours.
- Tighten the localizations changelog entry to two lines, matching the
  threadLabel / commandUsernameLabel format.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(localizations): drop UI context from changelog entry

The stream_chat_localizations package doesn't know which UI surface
consumes a translation; localizations CHANGELOG entries should describe
the translation itself, not the consumer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Sahil Kumar <sahil@getstream.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
xsahil03x and others added 3 commits June 4, 2026 12:48
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* deprecate typedef

* deprecate icons

---------

Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants